from typing import Optional, Dict, Any, List
from openai import OpenAI
from .tool_registry import tool_registry
from .scheduler import scheduler
from config import OPENAI_CONFIG


class Agent:
    """智能体：对接OpenAI API，通过大模型决策工具调用"""

    def __init__(self):
        # 初始化OpenAI客户端（对接本地LLM服务）
        self.llm_client = OpenAI(
            api_key=OPENAI_CONFIG["api_key"],
            base_url=OPENAI_CONFIG["base_url"]
        )
        self.model = OPENAI_CONFIG["model"]
        self.temperature = OPENAI_CONFIG["temperature"]
        self.tool_registry = tool_registry
        self.scheduler = scheduler

    def _get_system_prompt(self) -> str:
        """系统提示：告诉大模型如何决策工具调用"""
        return """
        你是一个智能助手，需要根据用户需求判断是否需要调用工具。
        1. 如果不需要调用工具，直接回答用户问题。
        2. 如果需要调用工具，必须按照指定格式返回工具调用指令，不要返回其他内容。
        3. 只能使用已提供的工具，不要调用未定义的工具。
        4. 确保工具参数完整且格式正确。
        """

    def _parse_llm_response(self, response) -> Dict[str, Any]:
        """解析大模型响应，提取工具调用指令"""
        # 检查是否有工具调用
        if not response.choices[0].message.tool_calls:
            return {"type": "text", "content": response.choices[0].message.content}

        # 提取工具调用信息（只处理第一个工具调用，可扩展为多工具）
        tool_call = response.choices[0].message.tool_calls[0]
        return {
            "type": "tool",
            "tool_id": tool_call.function.name,
            "params": eval(tool_call.function.arguments)  # 解析参数（实际可用json.loads）
        }

    def process(self, user_query: str) -> str:
        """处理用户需求的完整流程：LLM决策→工具调用→结果整理"""
        print(f"\n📥 收到用户需求: {user_query}")

        # 1. 调用大模型，获取决策结果
        print("🤖 调用大模型决策是否需要工具...")
        response = self.llm_client.chat.completions.create(
            model=self.model,
            temperature=self.temperature,
            messages=[
                {"role": "system", "content": self._get_system_prompt()},
                {"role": "user", "content": user_query}
            ],
            # tools=self.tool_registry.get_tool_info_for_agent(),  # 传入工具列表
            tools=[],  # 传入工具列表
            tool_choice="auto"  # 让大模型自动决定是否调用工具
        )

        # 2. 解析大模型响应
        parse_result = self._parse_llm_response(response)

        # 3. 处理文本响应（无需工具）
        if parse_result["type"] == "text":
            return f"🗣️  大模型直接回复:\n{parse_result['content']}"

        # 4. 处理工具调用
        tool_id = parse_result["tool_id"]
        params = parse_result["params"]
        print(f"🔧 大模型决策：调用工具 {tool_id}，参数 {params}")

        # 5. 调度工具执行
        tool_result = self.scheduler.execute(tool_id, params)

        # 6. （可选）将工具结果回传给大模型，生成最终回复
        # 此处简化为直接返回工具结果，实际可让大模型整理结果后再回复
        return f"📋 最终处理结果:\n{tool_result}"


# 全局智能体实例
agent = Agent()